package com.base.helper;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @ClassName: PwdCheckUtil.java
 * @Description: 密码校验工具类
 */
public class PwdCheckUtil {

    public static String SPECIAL_CHAR = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";

    private static final Logger LOG = LoggerFactory.getLogger(PwdCheckUtil.class);

    public Result checkPassword(String password) {
        /**
         * @brief 检测密码中字符长度
         * @param[in] password 密码字符串
         * @return 符合长度要求 进行数字比较
         */
        if(password == null){
            password = "";
        }

        if (password.length() >= 8&&password.length()<=16) {
            char[] chPass = password.toCharArray();

            int num_count = 0;
            /**
             * @brief 检测密码中是否包含数字
             * @param[in] password 密码字符串
             * @return 包含数字 进行字母比较
             */
            for (int i = 0; i < chPass.length; i++) {
                if (Character.isDigit(chPass[i])) {
                    num_count++;
                }
            }
            if (num_count == password.length()) {
                LOG.error("密码不能全为数字！");
                return new Result(false, "密码不能全为数字", "请重新输入密码");
            } else if (num_count >= 1) {
                /**
                 * @brief 检测密码中是否包含字母（不区分大小写）
                 * @param[in] password 密码字符串
                 * @return 包含字母 进行小写字母比较
                 */
                int char_count = 0;

                for (int i = 0; i < chPass.length; i++) {
                    if (Character.isLetter(chPass[i])) {
                        char_count++;
                    }
                }
                if (char_count == password.length()) {
                    LOG.error("密码不能全为字母");
                    return new Result(false, "密码不能全为字母", "请重新输入密码");
                } else if (char_count >= 1) {
                    /**
                     * @brief 检测密码中是否包含小写字母
                     * @param[in] password 密码字符串
                     * @return 包含小写字母 进行大写字母比较
                     */
                    int char_countl = 0;
                    for (int i = 0; i < chPass.length; i++) {
                        if (Character.isLowerCase(chPass[i])) {
                            char_countl++;
                        }
                    }
                    if (char_countl == password.length()) {
                        LOG.error("密码不能全为小写字母！");
                        return new Result(false, "密码不能全为小写字母", "请重新输入密码");
                    } else if (char_countl >= 1) {

                        /**
                         * @brief 检测密码中是否包含大写字母
                         * @param[in] password 密码字符串
                         * @return 包含大写字母 进行特殊字符比较
                         */
                        int char_countu = 0;
                        for (int i = 0; i < chPass.length; i++) {
                            if (Character.isUpperCase(chPass[i])) {
                                char_countu++;
                            }
                        }
                        if (char_countu == password.length()) {
                            LOG.error("密码不能全为大写字母！");
                            return new Result(false, "密码不能全为大写字母", "请重新输入密码");
                        } else if (char_countu >= 1) {
                            /**
                             * @brief 检测密码中是否包含特殊符号
                             * @param[in] password 密码字符串
                             * @return 包含特殊符号 返回null
                             */

                            int special_count = 0;
                            for (int i = 0; i < chPass.length; i++) {
                                if (SPECIAL_CHAR.indexOf(chPass[i]) != -1) {
                                    special_count++;
                                }
                            }

                            if (special_count == password.length()) {
                                LOG.error("密码中不能全为含特殊字符！");
                                return new Result(false, "密码中不能全为含特殊字符！", "请重新输入密码");
                            } else if (special_count >= 1) {
                                return Result.SUCCESS;
                            } else {
                                LOG.error("密码中必须包含特殊字符！");
                                return new Result(false, "密码中必须包含特殊字符！", "请重新输入密码");
                            }
                        } else {
                            LOG.error("密码中必须包含大写字母！");
                            return new Result(false, "密码中必须包含大写字母！", "请重新输入密码");
                        }
                    } else {
                        LOG.error("密码中必须包含小写字母！");
                        return new Result(false, "密码中必须包含小写字母！", "请重新输入密码");
                    }
                } else {
                    LOG.error("密码中必须包含字母！");
                    return new Result(false, "密码中必须包含字母！", "请重新输入密码");
                }
            } else {
                LOG.error("密码中必须包含数字!");
                return new Result(false, "密码中必须包含数字！", "请重新输入密码");
            }
        } else {
            LOG.error("密码需要不小于八位且不大于16位！");
            return new Result(false, "密码需要不小于八位且不大于16位！", "请重新输入密码");
        }

    }

}
